import bean.JsonBean;
import bean.JsonBean.Book;
import bean.MyType;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.UnsupportedEncodingException;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world!");
        try {
            parseXml();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 静态方法中没有这个类的对象,也就是说不能使用this
        parseJson();

        try {
            byte[] bytes = "学".getBytes("utf-8");
            System.out.println(bytes.length);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }

    }

    /**
     * 解析json字符串
     */
    public static void parseJson(){
        String jsonStr = "{\n" +
                "    \"name\": \"zhangsan\",\n" +
                "    \"age\": 18,\n" +
                "    \"books\": [\n" +
                "      {\n" +
                "        \"name\": \"java\",\n" +
                "        \"author\": \"lisi\"\n" +
                "      },\n" +
                "      {\n" +
                "        \"name\": \"c++\",\n" +
                "        \"author\": \"liwu\"\n" +
                "      }\n" +
                "    ]\n" +
                "  }";
        // 将json字符串解析成java对象
        Gson gson = new Gson();
        JsonBean jsonBean = gson.fromJson(jsonStr, JsonBean.class);
        String name = jsonBean.getName();
        int age = jsonBean.getAge();
        List<Book> books = jsonBean.getBooks();
        for (int i = 0; i < books.size(); i++) {
            Book book = books.get(i);
            String bookName = book.getName();
            String author = book.getAuthor();
            System.out.println("book " + bookName +" " +author);
        }
        System.out.println("name是 " + name + "  " + age);

        // 将json字符串解析成java对象  对于数组类型
        String jsonArr = "[\n" +
                "  {\n" +
                "    \"name\": \"zhangsan\",\n" +
                "    \"age\": 18,\n" +
                "    \"books\": [\n" +
                "      {\n" +
                "        \"name\": \"java\",\n" +
                "        \"author\": \"lisi\"\n" +
                "      },\n" +
                "      {\n" +
                "        \"name\": \"c++\",\n" +
                "        \"author\": \"liwu\"\n" +
                "      }\n" +
                "    ]\n" +
                "  },\n" +
                "  {\n" +
                "    \"name\": \"lisi\",\n" +
                "    \"age\": 20,\n" +
                "    \"books\": [],\n" +
                "    \"geyan\": [\n" +
                "      \"逝者如斯夫,不舍昼夜\",\n" +
                "      \"明日复明日\"\n" +
                "    ]\n" +
                "  }\n" +
                "]";
        List<JsonBean> jsonBeanArr = gson.fromJson(jsonArr,
                new TypeToken<List<JsonBean>>(){}.getType()    );
//                new MyType().getType());
        for(JsonBean item : jsonBeanArr){
            System.out.println("jsonbean 中的每一项是 " + item);
        }


        // 将java对象 转换成json字符串
        String toJson = gson.toJson(jsonBean);
        System.out.println("jsonBean 对应的字符串是 " + toJson);


        // 内部类  静态内部类 区别
        Book book = new Book();
        // 内部类会持有宿主类的对象
        InnerDemo innerDemo = new InnerDemo();
        InnerDemo.Inner inner = innerDemo.getInner();
    }


    /**
     * 解析xml格式
     */
    public static void parseXml() throws Exception{
        // 需要分四步操作:
        // 第一步，通过创建 SAXReader 对象。来读取 xml  文件，获取 Document 对象
        // 第二步，通过 Document 对象。拿到 XML 的根元素对象
        // 第三步，通过根元素对象。获取所有的 book 标签对象
        // 第四步，遍历每个 book 标签对象。然后获取到 book 标签对象内的每一个元素，
        // 再通过 getText() 方法拿到起始标签和结束标签之间的文本内容

        SAXReader reader = new SAXReader();
        Document document = reader.read("./01-xml.xml");
        // 第二步，通过 Document 对象。拿到 XML 的根元素对象
        Element root = document.getRootElement();
        // 第三步，通过根元素对象。获取所有的 book 标签对象
        // Element.elements(标签名)它可以拿到当前元素下的指定的子元素的集合
        List<Element> books = root.elements("book");
        // 第四步，遍历每个 book 标签对象。然后获取到 book 标签对象内的每一个元素，
        for (Element book : books) {
            // 测试
            // System.out.println(book.asXML());
            // 拿到 book 下面的 name 元素对象
            Element nameElement = book.element("name");
            // 拿到 book 下面的 price 元素对象
            Element priceElement = book.element("price");
            // 拿到 book 下面的 author 元素对象
            Element authorElement = book.element("author");
            // 再通过 getText() 方法拿到起始标签和结束标签之间的文本内容
            System.out.println("书名" + nameElement.getText() + " , 价格:"+ priceElement.getText() + ", 作者：" + authorElement.getText());
        }
    }
}